ML }  X c0C)HCCH Mhhݩh `eCDiCD`  RyHP   * 1H0芢@) Y0.Ș` i #(PMR\ \b Pgi 0  % @ / ՠ`d   0DDԝLN@  )?HI Y0`HIJH) * J j * hJJJ )HJ h i     } YS S0 i`΢ϣ߳H J3xj2h} 1 |9 ӭ45(420 * (0241өX.`  R *i)Lvw  ~*P}E 5 LN(G E  r s k rsrL ( E LO(0d( L iE0O +)$IC  H S8 }q p h   j 8no CDLQ CFl M  LO Ri)Llk2'")*F }$F$F$F$F$ 5 )ШF/Șl]kpqС,LQ/A! Ti)Zlk@ ܬ/i)(")")k }$F$F$F 5$/L /lF@jj(LNkle$$%8(k()` R 8 ELO Ri)^>jf | NrC s } ) vw5g   enfo Glvw LQ@iLm>j FL ~Jjjjii p qEh }jlrs`LQ:$ȱ$@+[_#{ 8  Խut! ai 8   E I   ] C } H h    ˰ 8  N   Lm E  ,  [ `LQ ,/ 8 ~/  Ơ? ѩ}/  [ /Lj0?MoLn FjMqLp NklLOLQnLoMlNLO R"(+}ըHH`Q R!!  % !   / .   FȑF! /GF \H"+0+* }! F tLQnm: J~nTF1F  *n+)5! n (, n)1JJJn(n*o} I ,0  ci a oF? @ , 8,0 ʩ0H Eh   i}  D ]DmmFLQvtu`*&!*@h ] 0 ^0` c 0l$$%}()()%*&J%H,@hH hH@,h $% 8i8$(%)0hhH ]h`() c 0H c 0 h}`hhh&JJ ](ll  LQ0  /qnoHH 9 9 H H  I9  9 } Nd EH  Q8 o n  FnoL HII/ Ih8`h`Lnon`no`u F }E VEhLO/luF l0BF/lɜɛ׽hE N  b VFL FREE SECTORS C} H) *Fh ):FȽ F FC IH' 0 d  i:Fȩ/F.l`CD/08HDIC}IHȰ/F`ȱ$>.+.i ȱ$:刄H !A \ Hȱ$*?ȝ 2. ? [_{ ,0}-:) 0$:>WI  IТ,LQH  0hLd ~ t u`C ?( 0(C.` E } R =! .ti S0N EE D XC )0')AY  )ע ? 0E088FG \o}n  (HhLcL3 iJ i Lqp 0=rspnqopqlk`jZj0  j FL`H}FhȑFȽlFi0 h FFLFpvqwgneofLF pq7  G0i 0 FJJh1FqȱFpȱFk`B!}08`hEE D 8. =D}tui( TʩL`b!)    cȌaȌd b`aab}H8 hdaHcd8 cH hHH  \h hc` =Hh I8ih( t  ( t(!` L\}CJfCJfCJfCDfC` a  HII  INdh  `h  `n)8jHniPoijIjFIjFIjh` a } I 38  8H0 I  ' H LQ8j Y  8j NdY  &I &I &IHeH.p!}Iiq  `!.莿 2Jjj }.m Ȉ!m FG` ɩLQ z "} e Hi04 \ Ȍ  8 i h !`I0 `C Y8.`DOS SYS#} I  ` ~ݩ.C/`ba.m۩mѤC9 `C L] H  ,- '0 l $}, BLVDE`D1:AUTORUN.SYS8hhJ ȱHȱIȱBȱDȱEeeHHLV)  %}1*  ,,p-  0 I &  '0   Lw)l, 0  I&LD1:MEM.SAV&}E:D1:DUP.SYSKZpV 4&CZ5h0b#Dp`)„N)^Ƙ+# A(T'} D  C D     )16CS S)  C)D1 p p (}0 C9DI pCDL~CiCDiD` DD˙` d J)L !)}D L(( LL()  L| L( S LH 0p n  *} CY?  q  L L  ` )+} `A! d߰")-݆ "  $G@LLL&0") $G%,}H0 3S8`G ȱG ȱG   Gȭ Gȭ GG}GHiH8(()) G$H% `(0-})8` d)L ݆ & LGȘ ݆LL d  ! LL d)N>Q  HH).}  hyhyB q L> Lm JJ  Ln*` dB%'/}8  H H` 1 { LL   !L     Hh SY?  q  1L0}  !? S   q 1 L   Ll  Lg E`L   !L)  q 1L1}) `L0AM݊L݉ ML  N݆LLLNLMLHG!@2}1F GȱGLLEEȩÑEȑEEȑE Ed E7EȩE  q3} L !,0,0SGɛ L 1 !L EHEh W G gLLSROTCES EERF 4} G) *Gȩ GȽG GȌd q q G`  8   0G  `D5}CEDC0X:Ȣ Y ȱC* ? 0.. , 0%n ?A[ 0 : L`L  `, 0`Y6}`piH n0)բY? 08`0 7}  0$L GGȽG L `8L`L8}8`  05G)݁,G)ȱGȱGHh0})Hh` B! 8`8iiiLE`9}E8FEh( l0`ɃLL L8^~jj8jHi hEEEiEȱEiE` dTE:} H8EEȱEEȩEh J E8   . m  i`LI!)E1FR;}1LJ舩9GIH`LJJ`HGHh l`<} S gL   8 rii `дCDCG W  =}C  Lq` X٨`DOS SYS IIIIIIIIIIIIIIIC`0 ߩ0}}>},44 |||||DOS DOSDOS SYS }?}}}}/@}CDOS SYSA} 0`BDELV !B B}`LVUQ   ]   TU J ]L!T  #      TU C} L ? .  t`GBJ V~DEHI B V0dVD}QDEHI VF9 ,0 ,0 s0hhL  L` H hDHEhE}DEL8HI   0 HI,0 0  9 .G VLOF},0 L4*IJ`llD1:AUTORUN.SYSNEED MEM.SAV TO LOAD THIS FILE.D1:MEM.SAV J y08 B|DEHIG} V0 0`B;DELV䌚 !B y`@ʆ v s? F0Ξ05: [ BDEHIH} VY8 B V  @  /DE `E:D1:DUP.SYSERROR-SAVING USER MEMORY ON DISKTYPE Y TO I}STILL RUN DOS B;DE J V (` 9 V⪍ ઍ  -J}LLu DEHILV 9 .l 9 .l  `` s$B VBHK}I|DE V BLV nB,DE J V* \*` B V BLVDEHI BLVLL}1 3u H232435; 1 ;  hh@2 e1i1LHҍ 00) 08 109hh@ Ҡ2eM}1i1232435ޥ<<8}};======================; RETROFIRE!;; BY: TOM HUDSON;A.N.A.L.O.G. COMPUTING;======================;-----O}----------;PAGE ZERO USAGE;---------------ORG$80PLOTXDS1;PLOT X VALUEDRAWXDS1;DRAW X VALUEPLOTYDS1;PLOT P}Y VALUEDRAWYDS1;DRAW Y VALUEPLXHIDS1;PLOT X HI BYTEDRXHIDS1;PLOT Y HI BYTEACCXDS1;DRAW X ACCUMULATORACCXHIDQ}S1ACCYDS1;DRAW Y ACCUMULATORACCYHIDS1DELTAXDS1;DRAW WORKDELXHIDS1;DITTODELTAYDS1;DITTOINCXDS1;DRAW X R}INCREMENTINCYDS1;DRAW Y INCREMENTLODS1;INDIRECT ADDRESSHIDS1HOLDDS1;TEMP STORAGELOHLDDS1HIHLDDS1ENDPTDS}S1;DRAW ENDPOINTENDHIDS1COUNTRDS1;DRAW COUNTERCNTHIDS1COLORDS1;PLOT COLORXOFSETDS1;PLOT X OFFSETXDS1;T}GRID COORD...YDS1;HOLD AREASHGTIXDS1;GRID HEIGHTINDEXDS1;GRID INDEXDESTLODS1;MOVE DESTINATION...DESTHIDS1U};HOLD AREACOPCNTDS1;BYTE COPY COUNTCHARXDS1;CHARACTER X LOCCHARYDS1;CHARACTER Y LOCCHARNODS1;CHARACTER #CHINV}DXDS1;CHARACTER INDEXSNUMIXDS1;NUMBER INDEXDIGITSDS1;# OF DIGITS TO DISPLAYSHOBYTDS1;NUMBER HOLDVELADLDS1;W}VELOCITY ADD LOWVELADHDS1;VELOCITY ADD HIGHTIMERDS1;GENERAL EVENT TIMERSTKHLDDS1;STICK POS. HOLDSTKPOSDS1;STIX}CK POSITIONALTLOBDS1;LOW ALTITUDE BYTEGRDTYPDS1;GRID TYPEMSGCTDS1;MESSAGE COUNTMSGPTRDS1;MESSAGE POINTERTHRCY}NTDS1;THRUST COUNTERBALODS1;BINARY ALTITUDE LOWBAHIDS1;BINARY ALTITUDE HIRESULTDS1;DIVISION RESULTDIVISRDS1Z};DIVISORSHIPYDS1;SHIP GRID YSHIPYLDS1;SHIP Y LOWSHIPZDS1;SHIP GRID ZSHIPZLDS1;SHIP Z LOWSHPLRXDS1;SHIP P[}LAYER X POSLASTSYDS1;PREVIOUS SHIP YSHADOYDS1;SHIP SHADOW YLSHADYDS1;PREVIOUS SHADOW YSHPLRYDS1;SHIP PLAYER Y\}SHTEMPDS1;TEMPORARY STORAGENEWGRDDS1;NEW GRID FLAGNOSPOSDS1;NO SHIP SHOW FLAGGRDDIRDS1;SHIP'S MOVEMENT DIRECT]}IONTHRVOLDS1;THRUST VOLUMETHRTIMDS1;THRUST TIMEDLICNTDS1;DLI COUNTERMULT1DS1;MULTIPLY #1MULT2DS1;MULTIPLY^} #2LRESDS1;LOW MULT RESULTHRESDS1;HIGH MULT RESULTSUBYDS1;SHIP Y/ZSUBZDS1;WORK AREASTERRIXDS1;TERRAIN POS_}ITION INDEXT1DS1;TERRAIN...T2DS1;HEIGHT...T3DS1;WORK AREASBASEYDS3;BASE Y POSITIONSBASEZDS3;BASE Z POSITI`}ONSGYPDS3;SHIP Y POSITIONSGZPDS3;SHIP Z POSITIONSBASEIXDS1;BASE POSITION INDEXPFLASHDS1;PAD FLASH...PFLIXDSa}1;INDEXESVCHANCDS1;VOLCANO CHANCEVOLYDS1;VOLCANO Y AND Z...VOLZDS1;POSITIONSVOLIXDS1;VOLCANO POSITION INDEXb}VOLPXDS1;VOLCANO PLAYER XVOLPYDS1;VOLCANO PLAYER YVOLRADDS1;VOLCANO RADIATION FLAGRADLVLDS1;RADIATION LEVELRc}ADTIMDS1;RADIATION LEVEL TIMERPAUSEDDS1;PAUSE FLAGSNDCNTDS1;SOUND COUNTERSSTATSDS1;SOUND STATUSESNUMBRSDS3d};ALTITUDEDS3;X VELOCITYDS2;Y VELOCITYDS2;Z VELOCITYDS3;FUELDS1;SHIPS LEFTDS3;SCOREPOSNUMDS2;SHIP/e}BASE POSITIONS;------------------;MISC. MEMORY USAGE;------------------PMAREA=$0000;PLAYERS/MISSILESMISSLS=PMAf}REA+768PL0=PMAREA+1024PL1=PMAREA+1280PL2=PMAREA+1536PL3=PMAREA+1792DLIST=$1F00;DISPLAY LISTDISP=$2010;TOPg} OF DISPLAYDISP2=$3000;BOTTOM DISPLAY;--------------;SYSTEM EQUATES;--------------VDSLST=$200;DLI POINTERWSYh}NC=$D40A;WAIT FOR SYNCKEY=$2FC;KEYBOARD KEYCONSOL=$D01F;CONSOLE KEYSPMBASE=$D407;P/M BASE ADDRESSRANDOM=$D2i}0A;RANDOM NUMBERSETVBV=$E45C;VBI SETUPXITVBV=$E462;VBLANK EXITCOLBK=$2C8;COLOR REGISTERSCOLPF0=$2C4COLPF1=j}$2C5COLPF2=$2C6COLPF3=$2C7AUDC1=$D201;AUDIO CONTROLSAUDC2=$D203AUDC3=$D205AUDC4=$D207AUDF1=$D200AUDF2k}=$D202AUDF3=$D204AUDF4=$D206AUDCTL=$D208PRIOR=$026F;P/M PRIOITYATTRAC=$4D;ATTRACT MODEDMACTL=$22F;DMA Cl}ONTROLDLISTL=$230;DISP LIST POINTERGRACTL=$D01D;GRAPHICS CONTROLNMIEN=$D40E;INTERRUPT ENABLEPCOLR0=$D012;P/M m}COLORSCOLPM0=$2C0COLPM1=$2C1COLPM2=$2C2COLPM3=$2C3HPOSP0=$D000;PLAYER HORIZ POSITIONSHPOSP1=$D001HPOSP2=n}$D002HPOSP3=$D003HPOSM0=$D004HPOSM1=$D005STICK=$278;JOYSTICK 1ORG$2800;LOAD ADDRESSLOC$0800;EXECUTE ADo}DRESS;----------------------;DISPLAY LIST INTERRUPT;----------------------DLIPHA;SAVE ACCUMTXA;SAVE X REGISTEp}RPHALDXDLICNT;GET DLI NUMBERLDAECOLOR,X;AND RELATED COLORSTAWSYNC;WAIT FOR SYNCSTA$D015;AND SAVE COLORINCq}DLICNT;NEXT DLIPLA;RESTORE XTAXPLA;RESTORE ACCUMRTI;ALL DONE!!;----------------------------;RELOCATE PROr}GRAM TO $800;(USED BY DISK VERSION ONLY!);----------------------------MOVEITLDA#$2800/256;SET UP ORIGINSTAHI;ADDs}RESS INLDA#$2800&255;2-BYTESTALO;POINTER,LDA#$0800/256;SET UP DESTINATIONSTABAHI;ADDRESS INLDA#$0800&255;t}2-BYTESTABALO;POINTERLDY#0;RESET Y REGMOVELPLDA(LO),Y;MOVE A 256-BYTESTA(BALO),Y;BLOCK USING THEINY;Y REGu}.BNEMOVELPINCHI;NEXT 256-BYTEINCBAHI;BLOCK OF DATALDAHICMP#$40;DONE YET?BNEMOVELP;NO, KEEP MOVING!JMPv}PFIRST;ALL DONE, START GAME!!;------------------;MAIN PROGRAM START;------------------PFIRSTLDX#190LDA#$0F;Gw}R.8BDLOOPSTADLIST,X;BUILD DISP LSTDEXBNEBDLOOPLDA#$70;BLANK 8 LINESSTADLISTSTADLIST+1STADLIST+2LDA#$x}4F;LOAD MEM SCANSTADLIST+3STADLIST+107LDA#DISP/256;DISP ADDRESSSTADLIST+5LDA#DISP&255STADLIST+4LDA#DISy}P2/256;DISP 2 ADDRESSSTADLIST+109LDA#DISP2&255STADLIST+108LDA#$41;JVBSTADLIST+188LDA#DLIST/256;DLIST ADDz}RESSSTADLIST+190LDA#DLIST&255STADLIST+189LDA#$8F;DLI'SSTADLIST+31STADLIST+57STADLIST+118STADLIST+128{}STADLIST+138LDA#1;IT'S OUR...STAFTIME;FIRST TIME!PLANETCLD;NO DECIMAL MODE!JSR$E465;SETUP SOUND REGSJSR|}CLSCRN;CLEAR SCREENLDA#0;ZERO OUT PAGE ZEROLDX#127;ONLY LAST 128 BYTESCLPAG0STA$80,X;CLEAR BYTEDEX;MORE TO}} CLEAR?BPLCLPAG0;YUP!STADMACTL;SET ALL THESESTANMIEN;VARIABLES TOSTAAUDCTL;ZEROSTACOLPF2STACOLBKJSR~}PMCLR;CLEAR P/M AREASLDA#$FF;SET UP ENGINE...LDX#5;TEMP DISPLAYSPSLOOPSTAPL3+145,X;IN PLAYER 3,STAPL3+155,X};EACH 6 SCAN LINESSTAPL3+165,X;HIGH.DEX;LOOP UNTIL DONEBPLPSLOOP;--------------------------;INITIALIZE START}ING STATUS;--------------------------LDA#115;VOLCANO CHANCESTAVCHANC;(+-45%)JSRRNDBAS;RANDOM BASE LOCATION}LDX#16;INITIALIZE THEININUMLDAININBR,X;ESSENTIAL NUMERICSTANUMBRS,X;VALUES USINGSTAUNSNUM,X;ININBR (INITIAL NUM}BERS)DEX;MORE TO MOVE?BPLININUM;YUP!LDA#$0A;COLOR 1 WHITESTACOLPF1LDA#$0F;PLAYER 0 WHITESTACOLPM0;(S}HIP)LDA#$04;PLAYER 1 GRAYSTACOLPM1;(SHADOW)LDA#192;PLAYER 3 (ENGINE TEMPS)STAHPOSP3;HORIZONTAL POSITIONLDA}#DLI/256;SET UP DLISTAVDSLST+1;ADDRESSLDA#DLI&255STAVDSLSTLDA#DLIST&255;SET UP DISPLAY LISTSTADLISTL;ADDR}ESSLDA#DLIST/256STADLISTL+1LDA#PMAREA/256;SET UP PLAYER-MISSILESTAPMBASE;ADDRESSLDX#VBI/256;SET UP VBILDY}#VBI&255LDA#7JSRSETVBVLDA#$3E;TURN DMA ONSTADMACTLLDA#$3;ENABLE P/MSTAGRACTLLDA#$C0;ENABLE INTERRUPT}SSTANMIENLDA#2;MAKE BORDER...STACOLOR;COLOR 2;------------------------;DRAW BORDER USING TABLES;----------}--------------LDX#0;START WITH POINT #0BDRLPSTXSHTEMP;SAVE INDEXLDAXHIGH,X;GET X COORD HIPHA;SAVE ON STACK}LDAXLOW,X;GET X COORD LOWPHA;SAVE ON STACKLDAYLOW,X;GET Y COORDPHA;SAVE ON STACKLDALINTYP,X;PLOT?BEQITSP}LT;YUP!PLA;PULL DRAW YSTADRAWY;AND STOREPLA;PULL DRAW X LOWSTADRAWX;AND STOREPLA;PULL DRAW X HISTADRX}HI;AND STOREJSRDRAW;DRAW THE LINEJMPNXTBDR;DO NEXT POINTITSPLTPLA;PULL PLOT YSTAPLOTY;AND STOREPLA;PULL }PLOT X LOWSTAPLOTX;AND STOREPLA;PULL PLOT X HISTAPLXHI;AND STOREJSRPLOTCL;PLOT THE POINTNXTBDRLDXSHTEMP;R}ETRIEVE INDEXINX;NEXT POINTCPX#15;DONE?BNEBDRLP;NO!;-------------------------------;NOW SET UP CHARACTERS ON} SCREEN;-------------------------------LDX#73;74 CHARACTERSSETCHSTXCHINDX;SAVE INDEXLDAXP,X;GET CHAR X POSST}ACHARX;AND SAVELDAYP,X;GET CHAR Y POSSTACHARY;AND SAVELDACH,X;GET CHAR #STACHARNO;AND SAVEJSRSHONUM;SHO}W THE CHARACTERLDXCHINDX;GET INDEX,DEX;MORE CHARACTERS?BPLSETCH;YOU BET!SHOWEMLDARANDOM;GET RANDOM #,AND#}$1F;LIMIT TO 31 ANDCLC;ADD 40 TO GET RANGEADC#40;OF 40-71STASHIPY;STORE IT.LDARANDOM;REPEAT FOR ZAND#$1F}CLCADC#40STASHIPZLDA#0;NOW WE ZERO OUTLDX#5;ALL THE ENGINECLTEMPSTATEMP1,X;TEMPERATURES (COOL)DEXBPL}CLTEMPSTASIGNS;AND ZERO THESTASIGNS+1;SIGN VARIABLESSTASIGNS+2STASIGNS+3LDA#$C4;ENGINE COLORS ALL GREEN}STAECOLOR+2STAECOLOR+3STAECOLOR+4LDA#121;INIT RADIATIONSTARADLVL;LEVEL TO LOWLDA#$0F;AND SHOW WITHSTA}PL3+121;PLAYER 3LDA#0;NEXT WE ERASE ANYLDX#47;OTHER RADIATIONCLRADSTAPL3,X;GRAPHICS IN PLAYER 3INXCPX#122};ALL CLEAR?BCCCLRAD;NOT YET!JSRSHOALT;SHOW ALTITUDE,JSRSHOXV;X VELOCITY,JSRSHOYV;Y VELOCITYJSRSHOZV;Z VE}LOCITYJSRSHOFUL;FUELJSRSHOSHP;SHIPS LEFTJSRSHOSCO;AND SCORELDA#0;GRID TYPE 0...STAGRDTYP;(HI ALTITUDE)J}SRCLMESS;CLEAR MESSAGE AREAJSRRNDGRD;RANDOMIZE LAND GRIDJSRCLGRDA;CLEAR GRID GRAPHICS AREAJSRGRID;DRAW LAND GRI}DLDAFTIME;FIRST TIME?BEQMAINLN;NO, CONTINUEDECFTIME;NO LONGER 1ST TIME,JMPRESTRT;GO SHOW OPTIONSMAINLNLDA}PAUSED;PAUSED?BNEMAINLN;YES, WE'RE PAUSED!LDATIMER;READY FOR PROCESSING?BEQDOMESS;YES!JMPCKCONS;NO, CHECK CO}NSOLEDOMESSLDA#1;RESET TIMERSTATIMER;TO 1/60 SECSTAATTRAC;NO ATTRACT MODE;---------------------------;CHECK }RADIATION LEVEL TIMER;---------------------------LDANUMBRS;OVER 30000 FT?CMP#3BCCCKRTIM;NO!LDA#0;YES, HIGH }RAD!STARADTIMCKRTIMLDARADTIM;READY FOR MORE RADIATION?BNEADJALT;NOT YET.LDAVOLRAD;IS IT VOLCANO?BNEGOVOLR;}YES!LDXGRDTYP;GET GRID TYPE (ALT)LDARADINI,X;IS THERE RADIATION?BEQADJALT;NO RADIATIONSTARADTIM;RESET RADIATI}ON TIMERGOVOLRLDARADLVL;GET RADIATION AMOUNTCMP#48;FATAL?BCSRADOK;NO, WE'RE OK.JMPCRASH;KABOOM!!!RADOKSEC};ONE...SBC#1;MORE...STARADLVL;RADIATION UNIT!TAX;USE AS INDEX,LDA#$0F;AND SHOW ON SCREENSTAPL3,X;USING PL}AYER 3LDA#0;RESET VOLCANOSTAVOLRAD;RADIATION FLAG;---------------;ADJUST ALTITUDE;---------------ADJALTSED};SET DECIMAL MODELDASIGNS;ADD OR SUBTRACT?BEQSUBALT;SUBTRACT!JMPADDALT;ADD!JENDAJJMPENDAAJSUBALTLDAALTLO}B;GET ALT FRACTION BYTESEC;SUBTRACTSBCNUMBRS+4;X VELOCITY LOSTAALTLOB;AND SAVE BACKLDANUMBRS+2;GET ALT LO BY}TESBCNUMBRS+3;SUB XV MEDSTANUMBRS+2;AND SAVELDANUMBRS+1;GET ALT MED BYTESBC#0;SUB 0 & CARRYSTANUMBRS+1;AN}D SAVELDANUMBRS;GET ALT HI BYTESBC#0;SUB 0 & CARRYSTANUMBRS;AND SAVECMP#$90;NEGATIVE ALT?BCCJENDAJ;NO, ST}ILL IN AIR!;-------------------------------;AT THIS POINT, WE'VE HIT GROUND;-------------------------------CLD;NO} MORE DECIMAL MODELDANUMBRS+3;TALLY HIGH-ORDERORANUMBRS+6;VELOCITIES TO SEEORANUMBRS+8;IF ANY ARE >0BNECRASH;}TOO FAST!LDANUMBRS+4;IS X VELOCITYCMP#$11;> 10 FEET/SEC?BCSCRASH;YES!LDANUMBRS+7;IS Y VELOCITYCMP#$06;>5 }FEET/SEC?BCSCRASH;YES!LDANUMBRS+9;IS Z VELOCITYCMP#$06;>5 FEET/SEC?BCSCRASH;YES!LDATERRIX;DID WE LANDCM}PBASEIX;ON THE BASE?BNECRASH;NO!LDX#1;SAFE LANDINGLDY#14;AT 14TH SCREEN LINEJSRSHOMSG;SHOW THE MESSAGELDA}#255;WAIT 255/60STATIMER;(4.25) SECONDSLDELAYLDATIMER;TIME UP?BNELDELAY;NO, LOOP BACKLDX#3FSHFLPASLNUMBR}S+12;MULTROLNUMBRS+11;FUELROLNUMBRS+10;BY 10DEX;(THIS IS 4 SHIFTSBPLFSHFLP;IN DECIMAL MODE)SED;SELECT DE}CIMAL MODELDX#2CLCADSCLPLDANUMBRS+10,X;ADDADCNUMBRS+14,X;FUEL X 10 TOSTANUMBRS+14,X;SCOREDEXBPLADSCLP}CLD;NO MORE DECIMALJSRSHOSCO;SHOW SCORESCOTIMLDA#240;WAIT 4 SECSSTATIMERSTWAITLDATIMER;TIME UP?BNESTWAIT};NO, WAIT MORELDAVCHANC;IS VOLC CHANCECMP#255;AT MAXIMUM?BEQGOAGIN;YES!CLC;NO, INCREMENTADC#10;VOLCANO C}HANCESTAVCHANC;BY ABOUT 4%JSRRNDBAS;GET NEW BASE LOC.GOAGINJMPNEWLND;AND START LANDING CYCLECRASHLDARADLVL;W}AS DEATH DUECMP#47;TO RADIATION?BNEIMPCRS;NO, DUE TO IMPACTLDX#5;POINT TO RAD MESSAGEBNESHOCMS;GO SHOW THE ME}SSAGEIMPCRSLDX#2;POINT TO IMPACT MSGSHOCMSLDY#14;14TH SCREEN LINEJSRSHOMSG;SHOW THE MESSAGE!CRSHLPLDASHPLRY;C}ONVERT PLAYER YSEC;COORD TO GR.8SBC#34LDX#19;AND PUT IN ALLSCEXYSTAEXYP,X;EXPLOSION Y COORDSDEXBPLSCEXY}LDASHPLRX;CONVERT PLAYER XSEC;COORD TO GR.8SBC#48ASLALDX#19;AND PUT IN ALLSCEXXSTAEXXP,X;EXPLOSION X COOR}DSDEXBPLSCEXXLDA#0;POSITION SHIPSTASHPLRX;AND SHADOWSTASHPLRY;OFF-SCREENLDX#19;NOW RANDOMIZESCEXISLDA}RANDOM;EXPLOSION...ORA#$10STAEXXI,X;X INCREMENT,LDARANDOMORA#$10STAEXYI,X;Y INCREMENT,LDA#0STAEXXA,X};X ACCUMULATOR,STAEXYA,X;Y ACCUMULATOR,LDARANDOMORA#$10AND#$3FSTAEXLV,X;PIXEL LIFE.DEXBPLSCEXISBMISE}TEXTEXGOLDATIMER;TIME TO ADVANCE EXPL?BNEEXGO;NOT YET!SETEXTLDA#1;IT'S TIME!STATIMER;RESET TIMERLDX#19;20} PIXELSEXLPSTXTEMPCX;SAVE INDEXLDAEXLV,X;PIXEL ALIVE?BEQJXDEC;NO!LDAEXXP,X;NOW WE ERASE OLDSTAPLOTX;PIXEL}, SETTING UPLDAEXYP,X;THE X AND YSTAPLOTY;COORDINATESJSRPCALC;GET ADDRESS OF PLOTLDY#0LDABMASK2,X;MASK OFF} PIXELEOR(LO),YSTA(LO),Y;AND ERASE IT!LDXTEMPCX;GET INDEX BACKDECEXLV,X;DECREMENT LIFEBEQJXDEC;IT'S DEAD!}LDAEXXI,X;NOW MOVE PIXELCLC;IN X DIRECTIONADCEXXA,XSTAEXXA,XPHP;SAVE CARRY FLAGCPX#10;IF PIXEL >9,BCS}ADEXX;ADD INCREMENTPLP;RESTORE CARRYLDAEXXP,X;OTHERWISE,SBC#0;SUBTRACT IT!JMPSTOEXX;GO STORE RESULTJXDECJM}PEXDECADEXXPLP;RESTORE CARRYLDAEXXP,X;AND ADDADC#0;THE CARRY FLAGSTOEXXSTAEXXP,X;SAVE X POSITIONCMP#192;}IN DISPLAY WINDOW?BCSKILEXB;TOO FAR RIGHT!CMP#10;OK ON LEFT?BCCKILEXB;TOO FAR LEFT!STAPLOTX;SAVE IN PLOT COOR}D.LDAEXYI,X;INCREMENT Y POSITIONCLCADCEXYA,XSTAEXYA,XLDAEXYP,XSBC#0;SUBTRACT INCREMENT (UP)STAEXYP,X;S}AVE ITCMP#10;ON SCREEN?BCCKILEXB;OFF THE TOP!STAPLOTY;SAVE IN PLOT COORD.JSRPCALC;GET PLOT ADDRESSLDY#0L}DABMASK2,XEOR(LO),YSTA(LO),Y;AND PLOT PIXEL!EXDECLDXTEMPCX;MORE PIXELS?DEXBMICHKEXF;NO!JMPEXLPKILEXBLD}XTEMPCX;GET INDEX OF PIXELLDA#0;AND ZERO OUTSTAEXLV,X;LIFE BYTE (IT'S DEAD)BEQEXDEC;DO NEXT PIXELCHKEXFLDX#1}9;TALLY ALL LIFELDA#0;INDICATORSACCUEXORAEXLV,XDEXBPLACCUEXCMP#0;ANY ALIVE?BEQEXDONE;NO, EXPLOSION DONE!}JMPEXGO;YES, DO MOREEXDONELDA#255;WAIT 255/60 (4.25) SECSSTATIMERCTIMWTLDATIMER;TIME UP?BNECTIMWT;NO, WAI}T MOREDECNUMBRS+13;ONE LESS SHIPBMIOUTSHP;NO MORE SHIPS!JMPNXTSHP;GO DO NEXT SHIPOUTSHPLDX#0;GAME OVER MESSAG}ELDY#14;14TH LINE ON SCREENJSRSHOMSG;SHOW THE MESSAGERESTRTLDAKEY;GET KEYBOARD KEYCMP#$12;IS IT A "C"?BNEN}OCTGL;NO TOGGLELDXCOLORS+1;SWAP COLORS 1 & 2LDACOLORS+2STACOLORS+1STXCOLORS+2LDA#$FF;CANCEL KEYSTAKEYJ}MPPFIRST;REDRAW SCREENNOCTGLLDX#8;TITLELDY#30;30TH LINEJSRSHOMSGLDX#9;AUTHORLDY#45;45TH LINEJSRSHOMSG}LDX#10;MAGAZINELDY#55;55TH LINEJSRSHOMSGLDXGRAVTY;GET GRAVITY INDEXLDAGCHAR,X;GET L/M/HSTAGRVMSG+15;PU}T IN MESSAGELDX#7;GRAVITYLDY#75;75TH LINEJSRSHOMSGLDAIFUEL1;GET FUEL CHAR1ORA#$10;GET CHARACTER OFFSETST}AIFUMSG+12;PUT IN FUEL MESSAGELDAIFUEL2;GET FUEL CHAR2ORA#$10;GET CHARACTER OFFSETSTAIFUMSG+13;PUT IN FUEL MESS}AGELDX#6;FUELLDY#85;85TH LINEJSRSHOMSGRSTTIMLDATIMER;CONSOLE TIME READY?BNERSTTIM;NOT YETLDACONSOL;GET} CONSOLE KEYCMP#7;ANY PRESSED?BEQRESTRT;NO!CMP#6;START KEY?BEQRESTCK;YES! RESTARTCMP#3;OPTION KEY?BNEN}OTOPT;NO, IT'S SELECT!LDAGRAVTY;GET GRAVITYCLC;ADD 1 TO GET NEXTADC#1;GRAVITY LEVELCMP#3;BEYOND 0-2?BNEST}GRAV;NO, STORE IT.LDA#0;WRAP TO 0STGRAVSTAGRAVTY;STORE GRAVITYJMPCDELAY;AND DEBOUNCE CONSOLENOTOPTLDAIFUEL2};INCREMENT FUELCLC;AMOUNT (5000-14000)ADC#1STAIFUEL2CMP#10BNECKFLIMLDA#0STAIFUEL2LDAIFUEL1CLCADC}#1STAIFUEL1CKFLIMLDAIFUEL1;FUEL > 9000?BEQCDELAY;NO, GO DEBOUNCE CONSOLELDAIFUEL2CMP#5;FUEL = 15000?BNE}CDELAY;NOLDA#0;RESET FUEL TO 5000STAIFUEL1CDELAYLDA#30;WAIT 30/60 (1/2) SECSTATIMERJMPRESTRT;KEEP CHECKIN}G CONSOLERESTCKLDACONSOL;CONSOLE RELEASED?CMP#7BNERESTCK;NOT RELEASED, WAITLDAIFUEL1;GET SELECTED FUELSTAI}NINBR+10;AND PLACE INLDAIFUEL2;INITIAL NUMBERASLA;TABLE FOR PROPERASLA;INITIAL FUELASLAASLASTAININBR+11}JMPPLANET;RESTART GAMENXTSHPJSRSHOSHP;SHOW # OF SHIPSNEWLNDLDX#12;NOW WE MUSTREINILDAININBR,X;RE-INITIALIZE}STANUMBRS,X;ALL VITAL NUMBERSSTAUNSNUM,X;AND UNSIGNED NUMBERSDEXBPLREINIJMPSHOWEM;AND RESTART LANDINGADDALT}LDAALTLOB;THIS ROUTINECLC;ADDS OUR X VELOCITYADCNUMBRS+4;TO THE ALTITUDESTAALTLOB;WHEN WE'RE GOING UP.LDANU}MBRS+2ADCNUMBRS+3STANUMBRS+2LDANUMBRS+1ADC#0STANUMBRS+1LDANUMBRSADC#0STANUMBRSENDAAJCLD;NO MORE D}ECIMAL MODEJSRSHOALT;SHOW ALTITUDEJSRSHCALC;SHIP CALCS.LDX#0;FIND THE SCALELDANUMBRS;OF THE LANDING GRIDBNE}GOTSIZ;BASED ON OUR ALTITUDELDX#2CKSIZELDANUMBRS+1;COMPARE ALTITUDE TOCMPGRDLIM,X;GRID SCALE LIMITSBCCGOTSIZ}DEXBNECKSIZEGOTSIZCPXGRDTYP;SAME SCALE AS PREVIOUS?BEQDOGRAV;YUP!BCSGODOWN;NO, WE'RE GOING DOWN!STXGRDTYP};SAVE NEW GRID TYPELDA#1;GET RID OF SHIPSTANOSPOS;TEMPORARILYLDASHIPY;CALCULATE NEWJSRCSCUP;SHIP Y COORDLDA}GYP,XASLAASLAASLAASLACLCADCRESULTSTASHIPYLDASHIPZ;AND NEW Z COORDJSRCSCUPLDAGZP,XASLAASL}AASLAASLACLCADCRESULTSTASHIPZJMPGENGRD;GENERATE NEW GRIDGODOWNSTXGRDTYP;SAVE NEW GRID TYPELDA#1;GE}T RIDSTANOSPOS;OF SHIPLDASHIPY;CALCULATE NEWJSRCSCDN;SHIP Y COORDSTASHIPYTYALDXGRDTYPSTAGYP-1,XLDAS}HIPZ;AND SHIP Z COORDJSRCSCDNSTASHIPZTYALDXGRDTYPSTAGZP-1,XGENGRDJSRCLGRDA;CLEAR GRID AREAJSRRNDGRD;RA}NDOMIZE NEW GRIDJSRGRID;AND DRAW GRIDDOGRAVLDAUNSNUM+3;HAS SHIP REACHEDCMP#$05;TERMINAL VELOCITY?BEQNOGRAV;Y}ES--DON'T ACCELLERATESED;GO TO DECIMAL MODELDAUNSNUM+5;GET X VELOCITYCLCLDXGRAVTY;GET GRAVITY INDEX 0-2ADCGR}AVS,X;ADD PROPER GRAVITYSTAUNSNUM+5;SAVE NEW XVSTANUMBRS+5LDAUNSNUM+4ADC#0STAUNSNUM+4STANUMBRS+4LDAUNS}NUM+3ADC#0STAUNSNUM+3STANUMBRS+3LDX#3;POINT TO XVLDY#0;SIGN INDEXJSRNEGHAN;CHECK FOR NEGATIVENOGRAVJSR}SHOXV;SHOW XV ON SCREENRDSTIKLDXSTICK;GET STICK POSITIONSTXSTKHLD;SAVE ITLDAENGIX,X;THRUSTING?BNETHRUST;YUP}!JADJYZJMPADJYZP;ADJUST Y/Z POSTHRUSTLDANUMBRS+10;TALLY FUELORANUMBRS+11ORANUMBRS+12BNEGOFUEL;WE'VE GOT FUE}LLDASSTATS;DID WE ALREADY DOAND#1;OUT-OF-FUEL SOUND?BNENOFUEL;YES!LDASSTATS;SET OUT-OF-FUEL FLAGORA#1STA}SSTATSLDA#255;LOW PITCHSTAAUDF3;IN SOUND 3LDA#20;20/60 (1/3) SECSTASNDCNT;SOUND DURATIONLDX#4;OUT OF FUE}L MESSAGELDY#14;14TH SCREEN LINEJSRSHOMSG;SHOW MESSAGENOFUELJMPNOTHR;DON'T THRUST (NO FUEL)GOFUELLDANUMBRS+10};FUEL>10000?BNEFUELOK;YES, WE'RE OKLDANUMBRS+11CMP#$10;FUEL>999?BCSFUELOK;YES, STILL OKLDASSTATS;HAVE WE D}ONEAND#2;FUEL LOW SOUND?BNEFUELOK;YES, GO DO THRUSTLDASSTATS;SET FUEL LOW FLAGORA#2STASSTATSLDA#80;MEDI}UM PITCHSTAAUDF3;IN SOUND 3LDA#20;20/60 (1/3) SECSTASNDCNT;SOUND DURATIONLDX#3;FUEL LOW MESSAGELDY#14;14T}H SCREEN LINEJSRSHOMSG;SHOW THE MESSAGEFUELOKLDYSTKHLD;GET STICK TO FINDLDXENGIX,Y;WHICH ENGINE'S FIRINGLDYTEM}PS-1,X;GET ENGINE TEMPERATURELDAENGTHR,Y;AND THRUST FOR THAT TEMPBEQNOTHR;ENGINE'S DEAD!CMPRANDOM;ENGINE MAY BE }FIRINGBCSTHROK;IT IS!NOTHRJMPADJYZP;NO THRUST!THROKLDA#10;SET UPSTATHRVOL;THRUST VOLUMEINCTHRCNT;ONLY ALL}OW THRUSTLDATHRCNT;EVERY OTHER TIMEAND#1BNEJADJYZ;NO THRUST!SED;GO TO DECIMAL MODELDANUMBRS+12;AND SUBTRAC}TSEC;2 UNITSSBC#2;FROM FUELSTANUMBRS+12LDANUMBRS+11SBC#0STANUMBRS+11LDANUMBRS+10SBC#0STANUMBRS+1}0CLD;NO MORE DECIMAL MODEJSRSHOFUL;SHOW THE NEW FUEL AMT.LDXSTKHLD;GET STICK FOR INDEX,LDAVAL,X;AND GET AMOUN}TSTAVELADL;TO ALTER VELOCITY,LDAVAH,X;EITHER 1 OR -1STAVELADH;($01 OR $99)LDYFUELIX,X;GET INDEX TO VELOCITIES}CMP#$99;NEGATIVE VEL ALTER?BEQCKNLIM;YESLDAUNSNUM,Y;AT MAXIMUM VELOCITYCMP#$05;OF 500 FT/SEC?BEQADJYZP;YE}S!JMPADDTHR;GO ADD THE THRUSTCKNLIMLDAUNSNUM,Y;AT MINIMUM VELOCITYCMP#$95;OF -500 FT/SECBNEADDTHR;NO!LDAUN}SNUM+1,Y;AT -500 FT/SEC?CMP#$00BEQADJYZP;YES!ADDTHRLDYFSIGNS,X;GET VELOCITY DIRECTIONLDAFUELIX,X;AND VELOCITY} INDEXTAXJSRADDV;ADD THE VELOCITYJSRSHOYV;SHOW Y VELOCITYJSRSHOZV;AND Z VELOCITY;------------------;ADJUST} THE Y COORD;------------------ADJYZPLDY#6;CONVERT YVJSRCVDBIN;TO BINARYLDXGRDTYP;GET GRID TYPE FOR SCALELDY}VELSHF,X;AND DIVIDE BYSHFYLPLSRHI;THE PROPER FACTORRORLO;FOR THE GRID'SDEY;MAGNIFICATIONBNESHFYLPLDASIGNS}+1;IS VELOCITY NEGATIVE?BNESUBYV;YES, SUBTRACT ITLDASHIPYL;ADD SHIP'S VELOCITYCLC;TO THE SHIP'SADCLO;Y POSIT}IONSTASHIPYLBCCCKYLIMINCSHIPYJMPCKYLIM;AND CHECK LIMITSUBYVLDASHIPYL;SUBTRACT VELOCITYSEC;FROM THE SHIP'}SSBCLO;POSITIONSTASHIPYLBCSCKYLIMDECSHIPYCKYLIMLDA#0;NOT ONSTANEWGRD;NEW GRID YETSTAGRDDIR;ZERO GRID} DIRECTIONLDASHIPY;IS SHIP YCMP#180;< 0?BCSYLO;YES!CMP#112;IS IT > 111?BCCNAVY;NO, GO CHECK ZSEC;ADJU}ST IT BACKSBC#112;DOWN WITHIN THESTASHIPY;Y LIMITLDXGRDTYP;NOW ADJUST THEBEQSETGYI;SHIP'S NAVIGATIONALNXTGYI}LDAGYP-1,X;COORDINATES IFCLC;WE'RE NOT ONADC#1;GRID 0 (HIGHEST)CMP#7BNESTGYILDA#0STAGYP-1,XDEXBNE}NXTGYIBMISETGYISTGYISTAGYP-1,XSETGYIINCNEWGRD;GOING TO NEW GRIDJMPNAVY;GO ADJUST ZYLOCLC;ADJUST Y UPADC#}112;BY 112STASHIPYLDXGRDTYP;ADJUST NAVIGATIONALBEQSETGYD;COORDINATESNXTGYDLDAGYP-1,X;IF WE'RE NOTSEC;ON G}RID TYPE 0SBC#1BPLSTGYDLDA#6STAGYP-1,XDEXBNENXTGYDBMISETGYDSTGYDSTAGYP-1,XSETGYDINCNEWGRD;GOING TO} NEW GRIDLDA#1;DIRECTION 1STAGRDDIRNAVYLDXGRDTYP;THIS ROUTINE FINDSLDASHIPY;THE SHIP'S "Y"LSRA;NAVIGATION}AL POSITIONLSRALSRALSRASTAGYP,XLDA#0SYFINEINXCPX#3BEQNOSYFSTAGYP,XBNESYFINENOSYFLDY#2;SHOW S}HIP YJSRSHOPOS;NAVIGATIONAL POSITION;---------------;NOW THE Z COORD;---------------LDY#8;THIS ROUTINE IS THE}JSRCVDBIN;SAME AS THE ABOVELDXGRDTYP;"Y" ROUTINE, EXCEPTLDYVELSHF,X;THAT IT ADJUSTS THESHFZLPLSRHI;SHIP "Z" C}OORD.RORLODEYBNESHFZLPLDASIGNS+2BNESUBZVLDASHIPZLCLCADCLOSTASHIPZLBCCCKZLIMINCSHIPZJMPCKZLI }MSUBZVLDASHIPZLSECSBCLOSTASHIPZLBCSCKZLIMDECSHIPZCKZLIMLDASHIPZCMP#180BCSZLOCMP#112BCCCKCONS }SECSBC#112STASHIPZLDXGRDTYPBEQSETGZINXTGZILDAGZP-1,XCLCADC#1CMP#7BNESTGZILDA#0STAGZP-1,XDE }XBNENXTGZIBMISETGZISTGZISTAGZP-1,XSETGZIINCNEWGRDLDA#2;DIRECTION 2STAGRDDIRJMPCKCONSZLOCLCADC#112 }STASHIPZLDXGRDTYPBEQSETGZDNXTGZDLDAGZP-1,XSECSBC#1BPLSTGZDLDA#6STAGZP-1,XDEXBNENXTGZDBMISETG }ZDSTGZDSTAGZP-1,XSETGZDINCNEWGRDLDA#3;DIRECTION 3STAGRDDIRCKCONSLDXGRDTYP;FIND SHIP'S ZLDASHIPZ;NAVIGAT}IONALLSRA;COORDINATESLSRALSRALSRASTAGZP,XLDA#0SZFINEINXCPX#3BEQNOSZFSTAGZP,XBNESZFINENOSZF}LDY#3;SHOW SHIP'S ZJSRSHOPOS;NAVIGATIONAL POSITIONLDANEWGRD;ARE WE ON NEW GRID?BEQNONEWG;NOJSRCLGRDA;CLEAR }GRID AREALDXGRDDIR;GET GRID DIRECTION ANDLDYGDIX,X;SAVE THE HEIGHTS OFLDA#7;THAT GRID SIDE.STAHOLDCGSIDELDX}HSAVE,YLDAHEIGHT,X;SAVELDXHOLDSTAHGTSAV,X;SIDE'SDEY;COORDSDECHOLDBPLCGSIDEJSRRNDGRD;RANDOMIZE NEW G}RIDLDXGRDDIR;MOVE THE COORDINATESLDYGDIX,X;WE JUST SAVED TOLDA#7;THE NEW GRID'SSTAHOLD;OPPOSITE SIDERSTSID}LDXHOLDLDAHGTSAV,XLDXHREST,YSTAHEIGHT,XDEYDECHOLDBPLRSTSIDJSRGRID;DRAW THE GRIDNONEWGLDACONSOL;ARE} ANYCMP#7;CONSOLE KEYS PRESSED?BNEWTRELS;YES, WAIT FOR RELEASEJMPMAINLN;NO, KEEP PROCESSINGWTRELSLDACONSOL;IS} CONSOLE KEYCMP#7;RELEASED?BNEWTRELS;NOT YET!JMPPFIRST;RESTART GAME;-----------------------;DESCENT SCALING }ROUTINE;-----------------------CSCDNLDY#0;DIVIDE SHIP COORDCSCLPCMP#16;BY 16. PUT QUOTIENTBCCNOCADJ;IN Y AND }REMAINDERSEC;IN ACCUMULATORSBC#16INYJMPCSCLPNOCADJSTAHOLD;NOT MULT A BY 7ASLA;*2CLCADCHOLD;*3ASL}A;*6ADCHOLD;*7RTS;ALL DONE!;----------------------;ASCENT SCALING ROUTINE;----------------------CSCUPSTAR}ESULT;DIVIDE SHIP COORDLDA#7;BY 7STADIVISRLDA#0JSRDIVIDELDXGRDTYP;GET GRID TYPERTS;AND EXIT.;-------}-----------------------;DECIMAL TO BINARY WORK ROUTINE;------------------------------CVDBINLDANUMBRS+1,Y;GET DECIMAL} NUMBERAND#$0F;MASK OFF LOW DIGITSTALO;SAVELDANUMBRS+1,Y;GET DECIMALLSRA;MASK OFF HIGH DIGITLSRALSRAL}SRATAX;PUT IN INDEXLDALO;GET PREVIOUS DIGITCLC;AND ADDADCALT1L,X;DIGIT2 X 10STALO;SAVE ITLDANUMBRS,Y};GET NEXT DECIMAL #AND#$0F;MASK OFF LOW DIGITTAX;PUT IN INDEXLDALO;GET PREVIOUS RESULTCLC;AND ADDADCALT2L,}X;DIGIT3 X 100 PART 1STALO;SAVE ITLDA#0;AND CARRYADCALT2H,X;DIGIT3 X 100 PART 2STAHI;AND SAVE ITRTS;ALL }DONE!;--------------;SHOW SPACESHIP;--------------SHCALCNOP;------------------------------;CONVERT BCD ALTITUD }E TO BINARY;------------------------------LDANUMBRS+2;SIMILAR TO ABOVEAND#$0F;ROUTINE BUT WILLSTABALO;WORK FOR!} 3 BCD DIGITSLDA#0;AND IS DEDICATEDSTABAHI;FOR ALTITUDE ONLYLDANUMBRS+2LSRALSRALSRALSRATAXLDABALO"}CLCADCALT1L,XSTABALOLDANUMBRS+1AND#$0FTAXLDABALOCLCADCALT2L,XSTABALOLDABAHIADCALT2H,XSTAB#}AHILDANUMBRS+1LSRALSRALSRALSRATAXLDABALOCLCADCALT3L,XSTABALOLDABAHIADCALT3H,XSTABAHILD$}ANUMBRSAND#$0FTAXLDABALOCLCADCALT4L,XSTABALOLDABAHIADCALT4H,XSTABAHILSRBAHI;DIVIDE ALT. BYRO%}RBALO;4LSRBAHIRORBALOLDXGRDTYP;NOW DIVIDE BYLDAGRDDIV,X;GRID SCALING FACTORSTADIVISRLDABALOSTARESULT&}LDABAHIJSRDIVIDE;DO THE DIVISION;----------------------;CALC SHIP PLYR X COORD;----------------------LDASHI'}PZ;0-111LSRA;DIVIDE BY 4LSRA;(NOW 0-27)STASHTEMP;SAVE ITLDASHIPY;0-111LSRA;/2 = 0-55CLCADCSHTEMP;N(}OW 0-82CLCADC#56;ADD LEFT LIMITSTASHPLRX;GOT X POS. OF PLAYER!;----------------------;CALC SHIP PLYR Y COORD;)}----------------------LDASHIPZ;0-111LSRA;NOW 0-55STASHTEMP;SAVE ITLDA#201;BOTTOM OF GRIDSECSBCSHTEMP;*}NOW 146-201STASHTEMPSEC;NOW WE MUST SUBTRACTSBCRESULT;SCALED ALTITUDESTASHPLRY;DONE!;----------------------+}--------------;NOW ADJUST SHADOW HEIGHT FOR TERRAIN;------------------------------------LDASHIPY;0-111LSRA;0-55,}PHA;SAVE ON STACKAND#7;MASK TO 0-7STASUBYLDA#7;NOW SUBTRACTSEC;THIS FROM 7SBCSUBY;TO FLIP IT AROUNDST-}ASUBYPLA;GET SHIPY/2AND#$F8;MASK OFF TOP 5 BITSSTATERRIX;SAVE IN TERRAIN INDEXLDASHIPZ;0-111LSRA;0-55P.}HA;SAVEAND#7;MASK TO 0-7STASUBZLDA#7;NOW SUBTRACTSEC;THIS FROM 7SBCSUBZ;TO FLIP IT AROUNDSTASUBZPLA/};GET SHIPZ/2LSRA;DIVIDE BY 8LSRA;(/16 TOTAL)LSRACLCADCTERRIX;AND ADD TOSTATERRIX;TERRAIN INDEX;----0}-----------------;HIT VOLCANO ERUPTION?;---------------------CMPVOLIX;IS SHIP OVER VOLCANO?BNENOVHIT;NOLDAVOL1}PX;IS VOLCANO ACTIVE?BEQNOVHIT;NOLDANUMBRS;IS ALT>9999?BNENOVHIT;YES, NO VOLCANO HITLDANUMBRS+1;IS ALT>499?2}CMP#5BCSNOVHIT;YES, SHIP SAFELDA#1;UH-OH, WE'VE GOTSTAVOLRAD;VOLCANO RADIATION!!!LDA#0;FORCESTARADTIM;V3}OLCANO RADIATIONNOVHITLDXTERRIX;THIS ROUTINE GETSLDAHEIGHT,X;THE HEIGHTS OF THESTAT1;CORNERS OF THELDAHEIGHT+4}1,X;TERRAIN WE'RE OVERSTAT2;AND CALCULATES THELDASUBZ;HEIGHT OF THESTAMULT2;PARTICULAR POINTJSRTERCAL;UNDER 5}OUR SHIP.STAT3;THIS ROUTINE IS VERYLDXTERRIX;COMPLICATED, ANDLDAHEIGHT+8,X;SPACE DOES NOT PERMITSTAT1;IN-DEPT6}H DISCUSSIONLDAHEIGHT+9,X;OF THE TECHNIQUE.STAT2LDASUBZSTAMULT2JSRTERCALSTAT2LDAT3STAT1LDASUBYS7}TAMULT2JSRTERCALSTAT3LDASHTEMPSECSBCT3STASHADOY;GOT SHADOW HEIGHTCMPSHPLRY;SHIP BELOW SHADOW?BCSNOM8}THT;NO, SHIP'S AIRBORNEJMPCRASH;SPLAT!!!NOMTHTRTS;ALL DONE;-------------------------;TERRAIN HEIGHT CALCULATOR9};-------------------------TERCALLDAT1;THIS SUBROUTINECMPT2;IS USED BY THE ABOVEBCCTC1;SHADOW HEIGHTSEC;ROUT:}INE TO FINDSBCT2;THE HEIGHT OF THESTAMULT1;GROUND AT AJSRMULT;SPECIFIED POINT.LDALRESLSRALSRALSRACL;}CADCT2RTSTC1LDAT2SECSBCT1STAMULT1LDA#8SECSBCMULT2STAMULT2JSRMULTLDALRESLSRALSRALSRA<}CLCADCT1RTS;--------------;RANDOMIZE BASE;--------------RNDBASLDX#5;6 COORDSINBASELDARANDOM;GET A NUMB=}ERAND#7;FROM 0-6CMP#7;IS IT 7?BEQINBASE;YES, DON'T ALLOW!STABASEY,X;STORE IN Y/Z POSITIONDEXBPLINBASE>}LDABASEY+2;NOW CALCULATE BASEASLA;GRID INDEX WITH THEASLA;FORMULA:ASLACLC;IX=BASEY*8+BASEZADCBASEZ+2STA?}BASEIXLDY#0;SHOW BASE...JSRSHOPOS;Y POSITIONLDY#1;SHOW BASE...JSRSHOPOS;Z POSITIONRTS;AND EXIT.;---@}----------------------------;MULTIPLY ROUTINE;;THIS ROUTINE DOES AN UNSIGNED;MULTIPLY OF THE VALUES IN MULT1;AND MULA}T2, PLACING THE RESULT;IN HRES AND LRES.;-------------------------------MULTLDA#0STAHRESLDX#8MSHIFTASLAROLB}HRESASLMULT1BCCMLOOPCLCADCMULT2BCCMLOOPINCHRESMLOOPDEXBNEMSHIFTSTALRESRTS;--------------------C}------------;DIVIDE ROUTINE;;THIS ROUTINE DIVIDES A 16-BIT;NUMBER (LO 8 BITS IN RESULT,;HI 8 BITS IN ACCUMULATOR) BYD} THE;VALUE IN DIVISR. THE QUOTIENT IS;PLACED IN RESULT. THE REMAINDER;IS DISCARDED.;--------------------------------E}DIVIDELDX#8DIVL1ASLRESULTROLACMPDIVISRBCCDIVL2SBCDIVISRINCRESULTDIVL2DEXBNEDIVL1RTS;---------F}------;ADD TO VELOCITY;---------------ADDVSED;WANT DECIMAL MODELDAUNSNUM+1,X;ADD VELOCITY INCREMENTCLC;AMOUNG}T TO VELOCITYADCVELADL;INDICATED BYSTAUNSNUM+1,X;X REGISTER.STANUMBRS+1,XLDAUNSNUM,XADCVELADHSTAUNSNUM,XH}STANUMBRS,XNEGHANCMP#$50;IS IT NEGATIVE?BCSNEGVEL;YES!LDA#0;SET SIGN TO 0 (+)STOSGNSTASIGNS,Y;STORE SIGNCI}LD;NO MORE DECIMALRTS;AND EXIT!NEGVELLDA#0;SUBTRACT UNSIGNEDSEC;VELOCITY VALUE FROMSBCUNSNUM+1,X;ZERO AND SJ}TORE INSTANUMBRS+1,X;SIGNED VALUELDA#0SBCUNSNUM,XSTANUMBRS,XLDA#1;PUT 1 (-)...BNESTOSGN;IN SIGN;-----K}------------------------;SHOW SHIP/OBJECTIVE POSITIONS;-----------------------------SHOPOSLDAPYPOS,Y;GET Y POSITIONL}STACHARY;OF MESSAGELDXPOSNIX,Y;GET COORD INDEXLDYBASEY,X;GET COORD DIGIT 1LDAHI1,Y;CONVERT COORDSTAPOSNUM;M}TO DECIMALLDAHI2,Y;AND PLACE INSTAPOSNUM+1;WORK VARIABLELDYBASEY+1,X;GET COORD DIGIT 2LDAMED1,Y;ADD DIGIT 2'SN}SED;DECIMAL VALUECLC;TO WORK AREAADCPOSNUM+1STAPOSNUM+1LDAPOSNUMADC#0STAPOSNUMLDABASEY+2,X;ADD DIGO}IT 3'SCLC;DECIMAL VALUEADCPOSNUM+1;TO WORK AREASTAPOSNUM+1LDAPOSNUMADC#0STAPOSNUMCLDLDA#2;2 DIGITS P}TOSTADIGITS;DISPLAYLDX#17;17TH IN "NUMBRS"JMPSHOALL;SHOW THE NUMBER;-------------;SHOW ALTITUDE;-----------Q}--SHOALTLDA#98;98TH SCREEN LINESTACHARYLDA#3;3 DIGITS TO SHOWSTADIGITSLDX#0;0TH IN "NUMBRS"JMPSHOALL;SR}HOW THE NUMBER;---------------;SHOW X VELOCITY;---------------SHOXVLDASIGNS;GET 1ST SIGNJSRSHOARR;SHOW ITS ARS}ROWLDA#112;112TH SCREEN LINESTACHARYLDA#2;2 DIGITS TO SHOWSTADIGITSLDX#3;3RD IN "NUMBRS"JMPSHOALL;SHOW T}IT;---------------;SHOW Y VELOCITY;---------------SHOYVLDA#2;GET 2ND SIGNCLCADCSIGNS+1JSRSHOARR;SHOW ITSU} ARROWLDA#122;122ND SCREEN LINESTACHARYLDA#2;2 DIGITS TO SHOWSTADIGITSLDX#6;6TH IN "NUMBRS"JMPSHOALL;SHV}OW IT;---------------;SHOW Z VELOCITY;---------------SHOZVLDA#4;GET 3RD SIGNCLCADCSIGNS+2JSRSHOARR;SHOW W}ITS ARROWLDA#132;132ND SCREEN LINESTACHARYLDA#2;2 DIGITS TO SHOWSTADIGITSLDX#8;8TH IN "NUMBRS"JMPSHOALLX};SHOW IT;---------;SHOW FUEL;---------SHOFULLDA#146;146TH SCREEN LINESTACHARYLDA#3;3 DIGITS TO SHOWSTADY}IGITSLDX#10;10TH IN "NUMBRS"JMPSHOALL;SHOW IT;----------;SHOW SHIPS;----------SHOSHPLDA#160;160TH SCREEN Z}LINESTACHARYLDA#1;1 DIGIT TO SHOWSTADIGITSLDX#13;13TH IN "NUMBRS"JMPSHOALL;SHOW IT;----------;SHOW SCO[}RE;----------SHOSCOLDA#170;170TH SCREEN LINESTACHARYLDA#3;3 DIGITS TO SHOWSTADIGITSLDX#14;14TH IN "NUMBR\}S";------------;SHOW NUMBERS;------------SHOALLLDA#31;31ST CHAR ACROSSSTACHARXSTXSNUMIX;SAVE "NUMBRS" INDE]}XSNUMLPLDXSNUMIX;GET INDEXLDANUMBRS,X;GET BCD VALUEJSRSHOBCD;SHOW ITINCSNUMIX;NEXT BCD VALUEDECDIGITS;1 L^}ESS DIGITBNESNUMLP;NOT FINISHED YET!RTS;ALL DONE;----------------;BCD CHAR DISPLAY;----------------SHOBCDST_}ASHOBYT;SAVE BCD VALUELSRA;SHIFT RIGHTLSRA;TO GETLSRA;FIRST DIGITLSRAORA#$10;ADD CHAR. OFFSETSTACHARN`}O;SAVE FOR DISPLAYJSRSHONUM;AND DISPLAY ITINCCHARX;NEXT POS. ON SCREENLDASHOBYT;GET BCD BACKAND#$0F;GET SECOa}ND DIGITORA#$10;ADD CHAR OFFSETSTACHARNO;SAVE FOR DISPLAYJSRSHONUM;AND DISPLAY ITINCCHARX;NEXT SCREEN POSITIOb}NRTS;AND EXIT;-----------;SHOW ARROWS;-----------SHOARRPHA;SAVE ARROW #LSRA;DIV BY 2TAX;USE FOR INDEXc}LDAARRLO,X;GET SCREEN ADDRESSSTADESTLO;FOR THE ARROWLDAARRHI,X;AND SAVE ONSTADESTHI;PAGE ZEROLDY#0;INITIAd}LIZE COPY INDEXPLA;GET ARROW #ASLA;MULTIPLY BY 8 FORASLA;OFFSET INTO ARROWASLA;GRAPHICS TABLETAX;SAVE INDe}EXLDA#7;THERE ARE 8 BYTESSTADIGITS;IN EACH ARROWCOPARRLDAARROWS,X;GET GRAPHICS DATA,STA(DESTLO),Y;PUT ON SCREf}ENINX;NEXT ARROW BYTETYA;ADD 40 TO Y REGISTERCLC;TO POINT TO NEXTADC#40;GRAPHICS 8 LINETAY;(40 BYTES PER g}LINE)DECDIGITS;MORE ARROW DATA?BNECOPARR;YES, KEEP COPYINGRTS;ALL DONE;--------------;CLEAR P/M AREA;-----q}BJDOS SYSBNRETRO ASM---------PMCLRLDA#0;PUT ZEROS INTAY;ALL 256 POSITIONSPMCLPSTAMISSLS,Y;OF MISSILES,STAPL0,Y;PLAYER 0STAPL1r},Y;PLAYER 1STAPL2,Y;PLAYER 2STAPL3,Y;PLAYER 3DEY;DONE?BNEPMCLP;NOT YETRTS;EXIT;------------;CLEAR Ss}CREEN;------------CLSCRNLDX#29;CLEAR 30*256 BYTESLDA#DISP/256;PUT DISPLAYSTAHI;ADDRESS INLDA#0;PAGE ZEROt}STALO;WORK AREACLSLP1TAY;ZERO Y REGISTERCLSLP2STA(LO),Y;CLEAR A BYTEDEY;DONE WITH 256?BNECLSLP2;NOPE!DEXu};DONE WITH 30?BNENXTCLR;NOPE!RTS;ALL DONE!NXTCLRINCHI;NEXT 256-BYTE GROUPBNECLSLP1;LOOP BACK;------------v}-------------;CLEAR GRID AREA OF SCREEN;-------------------------CLGRDALDA#0;POINT TO 100TH LINESTASHPLRX;OF SCRw}EENLDA#[DISP+2+100*40]/256STAHILDA#[DISP+2+100*40]&255STALOLDX#72;CLEAR 72 GROUPSCGRDL1LDY#21;OF 22 BYTESx}LDA#0CGRDL2STA(LO),Y;CLEAR A BYTEDEY;DONE WITH 22?BPLCGRDL2;NOT YET!DEX;DONE 72 GROUPS?BNENXTCGD;NOPE!y}RTS;ALL DONE!NXTCGDLDALO;POINT TO NEXT LINECLC;OF SCREENADC#40;(40 BYTES IN GR.8)STALOBCCCGRDL1INCHIz}BNECGRDL1;------------------;CLEAR MESSAGE AREA;------------------;POINT TO 14TH LINE OF SCREENCLMESSLDA#[DI{}SP+2+14*40]/256STAHILDA#[DISP+2+14*40]&255STALOLDX#8;CLEAR 8 GROUPSCMESS1LDY#21;OF 22 BYTESLDA#0CMESS2S|}TA(LO),Y;CLEAR A BYTEDEY;DONE 22 BYTES?BPLCMESS2;NOT YET!DEX;DONE 8 GROUPS?BNENXTCMS;NOPE!RTS;ALL DONE}}NXTCMSLDALO;ADVANCE 40 BYTESCLC;TO NEXT SCREEN LINEADC#40STALOBCCCMESS1INCHIBNECMESS1;------------;~}SHOW MESSAGE;------------SHOMSGSTYCHARY;SET SCREEN LINELDYMSGIX,X;POINT TO MESSAGE TEXTLDA#2;2ND CHAR ON SCRE}ENSTACHARXLDX#22;22 CHARACTERS TO SHOWSTXMSGCTSTYMSGPTRMSGLPLDXMSGCT;GET COUNT IN MESSAGELDYMSGPTR;POINT} TO MESSAGE CHARLDAMESSGE,Y;GET CHARACTERSTACHARNO;GET READY TO SHOW ITJSRSHONUM;SHOW IT!DECMSGCT;LAST CHARAC}TER?BNENXTMBT;NOT YET!RTS;ALL DONENXTMBTINCCHARX;NEXT X POSITIONINCMSGPTR;NEXT CHARBNEMSGLP;LOOP BACK;}--------------------------;GRAPHICS 8 CHAR. GENERATOR;--------------------------SHONUMLDACHARYSTALO;SAVE Y POSL}DA#0STAHIASLLO;*2ROLHIASLLO;*4ROLHIASLLO;*8ROLHILDALOCLCADC#DISP&255;ADD DISPLAY STARTSTA}DESTLOLDAHIADC#DISP/256STADESTHIASLLO;*16ROLHIASLLO;*32ROLHILDALOCLCADCDESTLO;GET CHARACTER'}SSTADESTLO;SCREEN ADDRESSLDAHIADCDESTHISTADESTHILDADESTLO;ADD X OFFSETCLC;FOR FINAL ADDRESSADCCHARX}STADESTLOBCCNODHININCDESTHINODHINLDACHARNO;GET OFFSET INTOSTALO;CHARACTER SETLDA#0STAHISTACOPCNT;ZER}O COPY COUNTASLLO;*2ROLHIASLLO;*4ROLHIASLLO;*8ROLHILDAHI;GET INFORMATIONCLC;FROM O.S. CHARACTER}ADC#$E0;SET AT $E000STAHICOPNUMLDYCOPCNTLDA(LO),Y;GET CHAR. IMAGE BYTELDY#0STA(DESTLO),Y;PUT ON SCREENI}NCCOPCNT;NEXT CHARACTER BYTELDACOPCNT;ARE ALL 8 BYTESCMP#8;IN CHARACTER MOVED?BEQFINISH;YES!LDADESTLO;ADD 4}0 BYTES TOCLC;POINT TO NEXT LINEADC#40;ON SCREENSTADESTLOBCCCOPNUMINCDESTHIBNECOPNUMFINISHRTS;ALL DON}E!;----------------------;RANDOMIZE GRID HEIGHTS;----------------------RNDGRDLDX#63;64 POINTS ON GRIDLDYGRDTYP};GET GRID TYPERGLPLDARANDOM;GET RANDOM NUMBER BUTAND#$0F;LIMIT IT TO THECMPMAXHGT,Y;MAXIMUM HEIGHTBCSRGLP;OF} THE GRID TYPESTAHEIGHT,X;SAVE HEIGHTDEX;DONE?BPLRGLP;NO!RTS;ALL DONE, EXIT;-------------;DRAW THE GRID};-------------GRIDCLDLDA#0STAVOLPX;NO VOLCANOLDX#0;CLEAR OUTTXA;PLAYER 2CP2LPSTAPL2,XDEXBNECP2LP}LDXGRDTYP;GRID TYPE 0 (HIGH)?BEQGOTBAS;YES, SHOW BASELDX#0;COMPARE SHIP'SBASCHKLDAGYP,X;GRID POSITIONSCMPBAS}EY,X;TO BASE'S.BNENOBASELDAGZP,XCMPBASEZ,X;IF THEY'RE NOT EQUAL,BNENOBASE;DON'T SHOW BASE!INXCPXGRDTYPB}NEBASCHKGOTBASLDXGRDTYP;-----------------;CALC BASE X COORD;-----------------LDABASEZ,X;THIS ROUTINE ISASL}A;SIMILAR TO THEASLA;SHIP PLAYER POSITIONSTASHTEMP;CALCULATOR ABOVE.LDABASEY,X;IT FINDS THE VOLCANO'SASLA;P/}M COORDINATES.ASLAASLACLCADCSHTEMPCLCADC#61STAHPOSP2;-----------------;CALC BASE Y COORD;----------}-------LDABASEZ,XASLAASLAASLASTASHTEMPLDA#196SECSBCSHTEMPTAY;----------------;COPY BASE SYMBOL};----------------LDX#4;5 BYTES IN BASE PIC.BSCOPYLDABASPIC,X;GET BASE PICTURE BYTESTAPL2,Y;PUT IN PLAYER 2IN}Y;NEXT PLAYER BYTEDEX;NEXT IMAGE BYTEBPLBSCOPY;COPY ALL 5 BYTES!;------------------------;MAKE BASE ZERO HEIGH}T IF;WE'RE ON FINAL APPROACH;------------------------LDXGRDTYP;IF GRID IS NOTCPX#2;TYPE 2 (LOW)...BNENOBASE;}LEAVE TERRAIN ALONE!LDXBASEIX;OTHERWISE WE MUSTLDA#0;MAKE THE 4 CORNERSNEWHGTSTAHEIGHT,X;OF THE LANDING GRIDSTA}HEIGHT+1,X;ALL ZERO HEIGHT!STAHEIGHT+8,XSTAHEIGHT+9,XJMPNOVOLC;AND BYPASS NEXT CODE.;-------------------------}-------;IF THERE'S NO BASE, LET'S TRY TO;PLACE A DANGEROUS VOLCANO!;--------------------------------NOBASELDAGRDTYP};ARE WE AT LOW ALT...CMP#2;(GRID TYPE 2)?BNENOVOLC;NO, NO VOLCANO!LDARANDOM;GET RANDOM #CMPVCHANC;IS IT > VO}LCANO CHANCE?BCSNOVOLC;YES, NO VOLCANO!VOLCZLDARANDOM;GET RANDOM VOLCANOAND#7;Y AND Z COORDINATESCMP#5;FROM 1}-5BCSVOLCZCLCADC#1STAVOLZVOLCYLDARANDOMAND#7CMP#5BCSVOLCYCLCADC#1STAVOLY;NOW GET VOLCANOASL}A;POSITION INDEXASLAASLACLCADCVOLZSTAVOLIX;--------------------------;CALC VOLCANO PLAYER COORDS;-----}---------------------LDAVOLZ;THIS ROUTINE ISASLA;SIMILAR TO THE BASEASLA;PLAYER POSITIONSTASHTEMP;ROUTINE. }IT USESLDAVOLY;VOLY & VOLZ TOASLA;CALCULATE THEASLA;VOLCANO'S PLAYERASLA;COORDINATES.CLCADCSHTEMPCLC}ADC#59STAVOLPXLDAVOLZASLAASLAASLASTASHTEMPLDA#186SECSBCSHTEMPSTAVOLPYLDXVOLIX;NOW SET THE} 4 CORNERSLDA#7;OF THE VOLCANO TOJMPNEWHGT;HEIGHT 7.NOVOLCLDA#1;SELECT PLOT COLORSTACOLORLDA#16;SET PLOT }X OFFSETSTAXOFSET;--------------------------------;THE FOLLOWING CODE TAKES THE;HEIGHT VALUES FROM THE "HEIGHT";T}ABLE AND PLOTS THE GRID ON THE;SCREEN.;--------------------------------LDA#0STAPLXHISTADRXHISTAHGTIXSTAX}NEXTX1LDA#0;ZERO Y INDEXSTAYTAY;PLOT FLAGNEXTY1LDAXOFSET;GET X POSITIONCLCADCXSTAPLOTX,Y;STORE IN PLOT}X/DRAWXLDA#170;GET Y POSITIONSECSBCYSECLDXHGTIXSBCHEIGHT,X;SUBTRACT GRID HEIGHTSTAPLOTY,Y;STORE IN PLOT}Y/DRAWYLDAY;DRAWING?BNEDRWIT1;YES!JSRPLOTCL;PLOT THE POINTJMPENDRW1;DO NEXT POINTDRWIT1JSRDRAW;DRAW TO TH}E POINTENDRW1LDAXOFSET;ADD 8 TO X OFFSETCLCADC#8STAXOFSETINCHGTIX;NEXT HEIGHT VALUELDY#1;NOW DRAWLDAY};ADD 8 TO Y INDEXCLCADC#8STAYCMP#57;PAST LIMIT?BCCNEXTY1;NO, LOOP BACK.LDA#16;RESET X OFFSETSTAXOFSET}LDAX;AND INCREMENT XCLC;FOR NEXT GRID LINEADC#16STAXCMP#113;PAST LIMIT?BCCNEXTX1;NO, LOOP BACK.;-----}-------------------------;NOW DO OTHER DIRECTION OF GRID;------------------------------LDA#0;ZERO OUT YSTAYLDA}#$FF;SET INDEX TO -1STAINDEXNEXTY2INCINDEX;NEXT INDEXLDAINDEXSTAHGTIX;SAVE IN HEIGHT INDEXLDA#0;ZERO OUT X}STAXTAY;SET Y REG FOR PLOTNEXTX2LDAXOFSET;FIND X POSITIONCLCADCXSTAPLOTX,Y;STORE IN PLOTX/DRAWXLDA#170};GET Y POSITIONSECSBCYLDXHGTIXSECSBCHEIGHT,X;ADJUST FOR HEIGHTSTAPLOTY,Y;STORE IN PLOTY/DRAWYLDAX;PLOT}TING?BNEDRWIT2;NO, DRAW IT.JSRPLOTCL;PLOT THE POINTJMPENDRW2;GO DO NEXT POINTDRWIT2JSRDRAW;DRAW TO THE POINT}ENDRW2LDAHGTIX;NEXT HEIGHT VALUECLCADC#8STAHGTIXLDY#1;NOW DRAWINGLDAX;NEXT X POSITIONCLCADC#16STAX}CMP#113;PAST LIMIT?BCCNEXTX2;NOLDAXOFSET;NEXT X OFFSET VALUECLCADC#8STAXOFSETLDAY;NEXT Y VALUECLC}ADC#8STAYCMP#57;PAST LIMIT?BCCNEXTY2;NO, LOOPRTS;ALL DONE.;--------------;VERTICAL BLANK;-------------}-VBICLD;NO DECIMAL MODE!LDA#0;RESET DLI INDEXSTADLICNT;---------------;CHECK FOR PAUSE;---------------L}DAKEY;GET KEYBOARD KETCMP#$21;SPACE BAR?BNEPCHK;NOLDAPAUSED;FLIP THEEOR#$FF;PAUSE STATUSSTAPAUSEDLDA#}$FF;RESET KEYPRESSSTAKEYPCHKLDAPAUSED;WE PAUSED?BEQNOPAU;NOJMPXITVBV;PAUSED, NO PROCESSING!NOPAULDACOLPM3};CYCLECLC;RADIATIONADC#1;COLORAND#$07;BRIGHTNESSORA#$30STACOLPM3LDATIMER;HANDLEBEQNOTDEC;GENERAL TI}MERDECTIMERNOTDECLDARADTIM;HANDLEBEQNORDEC;RADIATION TIMERDECRADTIMNORDECLDAVOLPX;VOLCANO?BEQFLSHP2;NOP}ESTAHPOSP2;POSITION PLAYER 2LDARANDOM;DO RANDOMANDRANDOM;ERUPTION GRAPHICSLDYVOLPYSTAPL2,YSTAPL2+4,YLD}ARANDOMANDRANDOMSTAPL2+2,YLDARANDOMAND#$3CSTAPL2+6,YLDA#$3ASTACOLPM2BNENOPFLS;NO PAD FLASHFLSHP2I}NCPFLASH;INCREMENTLDAPFLASH;PAD FLASH TIMERAND#$0FBNENOPFLS;NO FLASH YETINCPFLIX;FLIP FLASH COLOR INDEXLDA}PFLIXAND#1TAX;USE FOR INDEXLDAPCOLRS,X;GET PAD COLORSTACOLPM2;PUT IN PLAYER 2 COLORNOPFLSLDXLASTSY;NOW WE} ERASELDA#$FC;THE OLD SHIP...ANDMISSLS,XSTAMISSLS,XLDA#$FCANDMISSLS+1,XSTAMISSLS+1,XLDXLSHADY;AND SHAD}OWLDA#$F3ANDMISSLS,XSTAMISSLS,XLDA#$F3ANDMISSLS+1,XSTAMISSLS+1,XLDASHPLRX;POSITIONSTAHPOSM0;THE SHI}PSTAHPOSM1;AND SHADOWLDXSHPLRYSTXLASTSY;SAVE POSITION,LDA#$02;DRAW SHIP...ORAMISSLS,XSTAMISSLS,XLDA#$}02ORAMISSLS+1,XSTAMISSLS+1,XLDXSHADOY;AND SHADOWSTXLSHADYLDA#$08ORAMISSLS,XSTAMISSLS,XLDA#$08ORAM}ISSLS+1,XSTAMISSLS+1,XLDA#130;SET UP THRUSTSTAAUDF1;FREQUENCY 1LDA#8STAAUDF2;AND 2LDATHRVOL;GET THRUST} VOLUMESTAAUDC1;STORE IN AUDIO 1LSRA;DIVIDE BY 8LSRALSRASTAAUDC2;AND PUT IN AUDIO 2INCTHRTIM;TIME TO DE}CREMENTLDATHRTIM;THRUST VOLUME?AND#7BNEDOTEMP;NOT YETLDATHRVOL;IS VOLUME 0?BEQDOTEMP;YES, DON'T CHANGE!D}ECTHRVOL;LESS VOLUME!DOTEMPLDXSTICK;GET STICKLDAENGIX,X;AND ENGINE NUMBERSTASTKPOS;IS ENGINE BEING USED?BEQ}COOLIT;NO, COOL ALL ENGINESTAXDEXLDATEMP2,X;GET ENGINE TEMPCMP#$18;IS ENGINE DEAD?BCSCOOLIT;YES, DON'T HEAT }MORE!LDATEMP1,X;INCREMENT THECLC;TEMPERATURE.ADC#1STATEMP1,XLDATEMP2,XADC#0STATEMP2,XJSRSETCLR;GO }DO ENGINE COLORSCOOLITLDX#2;COOL ALL 3 ENGINESDECSTKPOSCOOLPCPXSTKPOS;IS THIS ENGINE IN USE?BEQNXCOOL;IF SO, }CON'T COOL IT!LDATEMP2,X;GET ENGINE TEMPCMP#$18;IS IT DEAD?BCSNXCOOL;YES, DON'T COOL IT.CMP#0;IS ENGINE HOT?}BNECOOLOK;YES, OK TO COOLLDATEMP1,X;GET LOW TEMP BYTECMP#2;IS ENGINE COLD?BCCNXCOOL;YES, DON'T COOLCOOLOKLDA}TEMP1,X;COOL OFF THESEC;ENGINE BYSBC#2;SUBTRACTING 2STATEMP1,X;FROM THE TEMPLDATEMP2,XSBC#0STATEMP2,X}JSRSETCLR;SHOW ENGINE COLORNXCOOLDEX;MORE ENGINES?BPLCOOLP;YUP!VBDONELDASNDCNT;GET WARNING TONE COUNTBEQNOS}ND;IF 0, NO TONE.SEC;OTHERWISE,SBC#1;SUBTRACT 1 FROMSTASNDCNT;THE COUNT,LSRA;DIVIDE BY 2ORA#$A0;AND MAKE} IT THESTAAUDC3;VOLUME.NOSNDJMPXITVBV;VBI DONE!;-----------------;SET ENGINE COLORS;-----------------SETCLR}AND#$1F;MASK OFF HI TEMP,LSRA;DIVIDE BY 8LSRALSRASTATEMPS,X;GET TEMP COLOR INDEXTAYLDAENGCLS,Y;GET COLO}RCMPECOLOR+2,X;SAME AS CURRENT?BEQNOCCHG;YES, NO CHANGESTAECOLOR+2,X;NEW COLOR:LDA#20;SET UP ENGINE TEMPSTA}SNDCNT;TONE COUNTASLA;AND FREQUENCYSTAAUDF3;OF 40.NOCCHGRTS;EXIT;--------------------------------;GR. 8+ P}LOTTER ROUTINE;;THIS ROUTINE PLOTS IN GRAPHICS 8;IN 4 COLORS, DETERMINED BY 0-3;IN "COLOR".;------------------------}--------PLOTCLJSRPCALCLDYCOLOR;GET COLORLDABMASK2,X;AND MASK OFFANDCOLORS,Y;PIXEL POSITIONSTAHOLD;SAVE IT},LDABMASK1,X;MASK OFF PIXELLDY#0;OF THE ADDRESSAND(LO),Y;TO BE ALTEREDORAHOLD;SET THE PLOTSTA(LO),Y;BITS }AND STORE!RTS;FINIS!;---------------;PLOT CALCULATOR;---------------PCALCLDAPLOTYASLASTALOLDA#0ROL}ASTAHI;*2ASLLOROLHI;*4ASLLOLDALOSTALOHLDROLHILDAHISTAHIHLD;*8ASLLOROLHI;*16ASLLOROL}HI;*32LDALOCLCADCLOHLDSTALOLDAHIADCHIHLDSTAHI;+*8=*40LDA#DISP&255;ADD THE DISPLAYCLC;ADDRESS T}O GETADCLO;THE ACTUALSTALO;ADDRESS OF THELDA#DISP/256;BYTE THAT WILLADCHI;BE ALTERED FORSTAHI;THE PLOT.}LDAPLOTX;MASK PLOTX FORAND#7;PLOT INDEX,LSRATAX;PLACE IN X.LDAPLXHILSR ALDAPLOTX;GET PLOTX ANDROR A}LSRA;DIVIDELSRA;BY 8,CLC;ADD TOADCLO;PLOT ADDRESSSTALO;FOR FINAL PLOTLDAHI;ADDRESS.ADC#0STAHIRT}S;EXIT!;--------------------------------;GRAPHICS 8+ DRAW HANDLER;;THIS ROUTINE IS A MODIFICATION;OF THE GRAPHICS} 7+ HANDLER FROM;A.N.A.L.O.G. #11.;--------------------------------DRAWLDADRAWY;GET DRAWTO YCMPPLOTY;IS DRAWY>PL}OTY?BCCYMINUS;NO!SEC;SUBTRACTSBCPLOTY;PLOTY FROM DRAWYSTADELTAY;AND SAVE DIFFERENCELDA#1;Y INCREMENTSTA}INCY;=1 (DOWN)BNEXVEC;NOW DO XYMINUSLDAPLOTY;SUBTRACTSEC;DRAWY FROM PLOTYSBCDRAWYSTADELTAY;AND SAVE DIFF}ERENCELDA#255;Y INCREMENTSTAINCY;=-1 (UP)XVECLDADRXHI;IS DRAWXCMPPLXHI;> PLOTX?BCCXMINUS;NO!BNENOCMP } ;MAYBE...LDADRAWXCMPPLOTXBCCXMINUS;NO!NOCMPLDADRAWX;SUBTRACT PLOTXSEC;FROM DRAWXSBCPLOTXSTADELT}AX;AND SAVE DIFFERENCELDADRXHISBCPLXHISTADELXHI;SAVE HI BYTE TOOLDA#1;X INCREMENTSTAINCX;=1 (RIGHT)BNEV}ECSET;BRANCH!XMINUSLDAPLOTX;SUBTRACTSEC;DRAWX FROM PLOTXSBCDRAWXSTADELTAX;AND SAVE DIFFERENCELDAPLXHISBC}DRXHISTADELXHI;SAVE HI BYTE TOOLDA#255;X INCREMENTSTAINCX;=-1 (LEFT)VECSETLDA#0;ZERO OUTSTAACCY;ALL ACCU}MULATORSSTAACCXSTAACCXHISTAACCYHILDADELXHI;IS DELTAX>DELTAY?BNEXMAX;YES!LDADELTAX;MAYBE...CMPDELTAY}BCCYMAX;NO, Y IS LARGERXMAXLDADELXHI;SET UP DRAWSTACNTHI;COUNTER ANDSTAENDHI;ENDPOINTLDADELTAXSTACOUNTR}STAENDPTLDAENDHI;DIVIDE ENDPOINTLSRA;BY 2 FORLDAENDPT;Y ACCUMULATORRORASTAACCYJMPDRAWGO;START DRAWING}YMAXLDA#0;DELTA Y LARGER,STACNTHI;STORE IT INSTAENDHI;THE DRAW COUNTERLDADELTAY;AND ENDPOINTSTACOUNTRSTA}ENDPTLSRA;DIVIDE BY 2 ANDSTAACCX;SET X ACCUMULATORDRAWGOLDACOUNTR;IF COUNTR>0...ORACNTHIBNEBEGIN;WE DRAW!}RTS;OTHERWISE, EXITBEGINLDAACCY;ADD DELTA YCLC;TO Y ACCUMULATORADCDELTAYSTAACCYLDAACCYHIADC#0STAACC}YHICMPENDHI;AT ENDPOINT?BCCBEGIN2;NO, DO XBNEADJYLDAACCY;CHECK LOW BYTECMPENDPTBCCBEGIN2;DO XADJYLDA}ACCY;SUBTRACT ENDPOINTSEC;FROM Y ACCUMULATORSBCENDPTSTAACCYLDAACCYHISBCENDHISTAACCYHILDAPLOTY;INCREME}NT YCLC;POSITIONADCINCYSTAPLOTYBEGIN2LDAACCX;ADD DELTA X TOCLC;X ACCUMULATORADCDELTAXSTAACCXLDAACC}XHIADCDELXHISTAACCXHICMPENDHI;AT ENDPOINT?BCCPLOTIT;NO, GO PLOT!BNEADJXLDAACCX;CHECK LOW BYTECMPENDPT}BCCPLOTIT;GO PLOTADJXLDAACCX;SUBTRACT ENDPOINTSEC;FROM X ACCUMULATORSBCENDPTSTAACCXLDAACCXHISBCENDHI}STAACCXHILDAINCX;WHICH DIRECTION?BMISUBX;GOING LEFTBPLADDX;GOING RIGHTBBEGINBNEBEGIN;LEAPFROG JUMPADDXLDA}PLOTX;ADD INCREMENTCLC;TO PLOTXADCINCXSTAPLOTXLDAPLXHIADC#0STAPLXHIJMPPLOTIT;GO DO THE PLOTSUBXLDA}PLOTX;SUBTRACT 1SEC;FROM PLOTXSBC#1STAPLOTXLDAPLXHISBC#0STAPLXHIPLOTITJSRPLOTCL;PLOT THE POINTLDA}COUNTR;ONE LESS PIXELSEC;TO PLOTSBC#1STACOUNTRLDACNTHISBC#0STACNTHIORACOUNTR;DONE PLOTTING?BNEBBEG}IN;NOT YET!RTS;FINIS!;---------;GRID DATA;---------MAXHGTDB1,4,8;MAXIMUM GRID HEIGHTSGRDLIMDB$00,$80,$10};ALTITUDE LIMITS (X100');-----------;PLOT TABLES;-----------COLORSDB$00,$55,$AA,$FFBMASK1DB$3F,$CF,$F3,$FCBMA}SK2DB$C0,$30,$0C,$03;----------------;BORDER PLOT DATA;----------------LINTYPDB0,1,1,1,1,0,1,0 ;0=PLOT, 1=DRAW}DB1,0,1,0,1,0,1XHIGHDB0,1,1,0,0,0,0,0DB1,1,0,0,1,1,1XLOWDB10,54,54,10,10,192,192 ;COORDSDB192,54,54,192,192,32},32DB32YLOWDB10,10,180,180,10,10,180DB94,94,157,157,53,53,11DB93;--------------------------------;SCREEN CHA}RACTER POSITIONS, DATA;--------------------------------XPDB27,28,29,30,31,25,26,27DB28,29,25,26,27,28,29DB25,26,2}7,28,29,30,31,32DB33,34,25,26,27,28,29DB25,26,27,28,29DB25,26,27,28,25,26,27DB25,26,27,25,26,27,25DB26,27,28,2}9,25,26,27DB28,29,30,25,26,27,28DB29,30,37,37,37,37,37DB37,37,37,37YPDB16,16,16,16,16,30,30,30DB30,30,40,40,40},40,40DB58,58,58,58,58,58,58,58DB58,58,72,72,72,72,72DB82,82,82,82,82DB98,98,98,98,112,112,112DB122,122,122,13}2,132,132,146DB146,146,146,146,160,160,160DB160,160,160,170,170,170,170DB170,170,17,25,33,41,49DB57,65,73,81CHD}B51,40,41,48,26,57,48,47DB51,26,58,48,47,51,26DB47,34,42,37,35,52,41DB54,37,26,57,48,47,51,26DB58,48,47,51,26D}B33,44,52,26,56,54,26DB57,54,26,58,54,26,38DB53,37,44,26,51,40,41DB48,51,26,51,35,47,50DB37,26,50,33,36,41,33D}B52,41,47,46;--------------------------------;TOP-OF-SCREEN MESSAGES & INDEXES;--------------------------------MSGI}XDB0,22,44,66,88,110,132DB154,176,198,220MESSGEDB0,0,0,0,0,0,39,33,45,37 ;GAME OVERDB0,47,54,37,50,0,0,0,0,0DB}0,0SUCLANDB0,0,51,53,35,35,37,51 ;LANDED OKDB51,38,53,44,0,44,33,46DB36,41,46,39,0,0CRSLANDB0,0,0,38,33,52,33},44 ;CRASHDB0,51,40,41,48,0,35,50DB33,51,40,0,0,0LOWFUDB0,38,53,37,44,0,44,37 ;LOW FUELDB54,37,44,0,35,50,4}1,52DB41,35,33,44,0,0OUTFUDB0,0,0,0,0,47,53,52,0,47 ;OUT OF FUELDB38,0,38,53,37,44,0,0,0DB0,0,0RADCRSDB0,0,5}0,33,36,41,33,52 ;RADIATIONDB41,47,46,0,47,54,37,50DB44,47,33,36,0,0IFUMSGDB0,0,0,0,0,0,38,53,37,44 ;INIT FUELD}B26,0,0,0,16,16,16,0,0,0DB0,0GRVMSGDB0,0,0,0,0,0,39,50,33,54 ;GRAVITYDB41,52,57,26,0,0,0,0,0,0DB0,0TTLMSGDB}0,0,0,0,0,0,50,37,52,50 ;TITLEDB47,38,41,50,37,1,0,0,0DB0,0,0AUTMSGDB0,0,0,0,34,121,26,0,52 ;AUTHORDB111,109,0,}40,117,100DB115,111,110,0,0,0,0MAGMSGDB0,0,0,33,46,33,44,47,39 ;MAGAZINEDB0,35,111,109,112,117DB116,105,110,103,}0,0,0IFUEL1DB0;INITIAL FUELIFUEL2DB5FTIMEDB0GRAVTYDB0;GRAVITY LEVELGRAVSDB10,24,48;GRAVITY FACTORSGCHARD}B44,45,40;L,M,H;----------------------;INITIAL NUMERICAL DATA;----------------------ININBRDB$02,$00,$00;ALTDB}$00,$00,$00;XVDB$00,$00;YVDB$00,$00;ZVDB$01,$00,$00;FUELDB$02;SHIPSDB$00,$00,$00;SCORE;------------- }---;DIRECTION ARROWS;----------------ARROWSDB0,$18,$18,$18,$7E,$3C,$18,0DB0,$18,$3C,$7E,$18,$18,$18,0DB0,$18,$C },$7E,$7E,$C,$18,0DB0,$18,$30,$7E,$7E,$30,$18,0DB0,$3C,$1C,$34,$64,$C0,0,0DB0,0,$C,$98,$B0,$E0,$F0,0ARRLODBLOW [DI }SP+29+112*40]DBLOW [DISP+29+122*40]DBLOW [DISP+29+132*40]ARRHIDBHIGH [DISP+29+112*40]DBHIGH [DISP+29+122*40]DB }HIGH [DISP+29+132*40];---------------;JOYSTICK TABLES;---------------ENGIXDB0,0,0,0,0,0,3,2 ;ENGINE NUMBERSDB0 },3,0,2,0,1,1,0FUELIXDB0,0,0,0,0,0,8,6 ;FUEL DATA POINTERSDB0,8,0,6,0,3,3,0FSIGNSDB0,0,0,0,0,0,2,1 ;DIRECTIONSD}B0,2,0,1,0,0,0,0VAHDB0,0,0,0,0,0,0,0 ;VELOCITY ADD VALS.DB0,$99,0,$99,0,0,$99,0VALDB0,0,0,0,0,0,1,1DB0,$99,0,$}99,0,1,$99,0;----------------------;DECIMAL TO BINARY DATA;----------------------ALT1LDB0,10,20,30,40DB50,60,70},80,90ALT2HDB0,0,0,1,1DB1,2,2,3,3ALT2LDB0,$64,$C8,$2C,$90DB$F4,$58,$BC,$20,$84ALT3HDB0,3,7,$B,$FDB$13,$17,$}1B,$1F,$23ALT3LDB0,$E8,$D0,$B8,$A0DB$88,$70,$58,$40,$28ALT4HDB0,$27,$4E,$75ALT4LDB0,$10,$20,$30GRDDIVDB88,22,}3;GRID DIVISION FACTORSVELSHFDB7,4,1;VELOCITY DIVISION FACS;----------------------------;GRID TERRAIN SAVE WORK AR}EAS;----------------------------GDIXDB7,15,23,31HSAVEDB56,57,58,59,60,61,62,63DB0,1,2,3,4,5,6,7DB7,15,23,31,39},47,55,63DB0,8,16,24,32,40,48,56HRESTDB0,1,2,3,4,5,6,7DB56,57,58,59,60,61,62,63DB0,8,16,24,32,40,48,56DB7,15,2}3,31,39,47,55,63ENGCLSDB$C4,$16,$34,$02 ;ENGINE COLORSENGTHRDB255,200,90,0 ;ENG EFFECTIVENESSRADINIDB120,255,0} ;RADIATION TIMESBASPICDB$80,$40,$F0,$20,$10 ;PAD IMAGEPCOLRSDB$00,$32 ;PAD COLORSPYPOSDB72,82,30,40POSN}IXDB0,3,6,9HI1DB0,0,0,1,1,2,2HI2DB0,$49,$98,$47,$96,$45,$94MED1DB0,$07,$14,$21,$28,$35,$42ECOLORDB$16,$C4,0,0,}0 ;DLI COLORSUNSNUMDS17;UNSIGNED NUMBERSSIGNSDS4;SIGN INFORMATIONHEIGHTDS64;GRID HEIGHTHGTSAVDS8;HEIGHT SAV}ETEMP1DS3;ENGINE...TEMP2DS3;TEMPSTEMPSDS3;0,1,2,3 TEMPS;EXPLOSION DATAEXLVDS20;EXPLOSION LIFEEXXPDS20};X POSITIONSEXYPDS20;Y POSITIONSEXXIDS20;X INCREMENTEXYIDS20;Y INCREMENTEXXADS20;X ACCUMEXYADS20;Y ACCUM}TEMPCXDS1ENDMOVEIT+$2000IONSEXXIDS20;X INCREMENTEXYIDS20;Y INCREMENTEXXADS20;X ACCUMEXYADS20;Y ACCUM